//
// Created by wxd on 2025/8/25.
//

#pragma once

#ifndef MATRIXTRANSFORMUTILS_H
#define MATRIXTRANSFORMUTILS_H

#include "glm/glm.hpp"

inline glm::mat3 getNormalMatrix(const glm::mat4& model) {
    const glm::mat3 model33 = glm::mat3(model);

    // 检查行列式，避免数值问题
    if (const float det = glm::determinant(model33); std::fabs(det) < std::numeric_limits<float>::epsilon()) {
        return glm::mat3(1.0f);
    }

    // 法线矩阵仅针对非均匀放缩的情况，均匀放缩不会影响法向的正交性
    const glm::vec3 scale(
        glm::length(glm::vec3(model[0])),
        glm::length(glm::vec3(model[1])),
        glm::length(glm::vec3(model[2]))
    );

    // 如果是均匀缩放或只有旋转，可以直接使用模型矩阵的3x3部分
    if (scale.x == scale.y && scale.y == scale.z) {
        return model33;
    }

    return glm::transpose(glm::inverse(model33));
}

#endif //MATRIXTRANSFORMUTILS_H
